//################################################################################
// MIT License
// Copyright (c) 2024 ZhangYihua
//
// Change Logs:
// Date           Author       Notes
// 2020-12-12     ZhangYihua   first version
//
// Description  : 
//################################################################################

module cic_comb #(
parameter           IDW                     = 28,
parameter           ODW                     = 28,
parameter           M                       = 16
) ( 
input                                       rst_n,
input                                       clk,
input                                       cke,

input               [IDW-1:0]               id,

output  reg         [ODW-1:0]               od
);

//################################################################################
// define local varialbe and localparam
//################################################################################
reg                 [IDW-1:0]               dat_dly[M-1:0];
wire                [IDW-1:0]               diff;

//################################################################################
// main
//################################################################################

always@(posedge clk or negedge rst_n) begin
    if (rst_n==1'b0) begin
        dat_dly[0] <=`U_DLY {IDW{1'b0}};
    end else if (cke==1'b1) begin
        dat_dly[0] <=`U_DLY id;
    end else
        ;
end

genvar g0;
generate for (g0=1; g0<M; g0=g0+1) begin:G_N
    always@(posedge clk or negedge rst_n) begin
        if (rst_n==1'b0) begin
            dat_dly[g0] <=`U_DLY {IDW{1'b0}};
        end else if (cke==1'b1) begin
            dat_dly[g0] <=`U_DLY dat_dly[g0-1];
        end else
            ;
    end
end endgenerate

assign diff = id - dat_dly[M-1];

always@(posedge clk or negedge rst_n) begin
    if (rst_n==1'b0) begin
        od <=`U_DLY {ODW{1'b0}};
    end else if (cke==1'b1) begin
        od <=`U_DLY diff[IDW-1-:ODW];
    end else
        ;
end

//################################################################################
// ASSERTION
//################################################################################

`ifdef CBB_ASSERT_ON
// synopsys translate_off


// synopsys translate_on
`endif

endmodule
